// @include "../code/Browser.js"
// @include "../code/Type.js"
// @include "../code/String.js"
// @include "../code/Array.js"
// @include "../code/Extend.js"
// @include "../extend/Debug.js"
/**
 * @fileOverview 节点css操作工具
 * 
 * @version qinglan_css 1.0
 * @static
 * @author wxq wxqqh@qq.com
 */
/**
 * 命名空间
 * 
 * @namespace
 * @type Object
 */
window.qinglan = window.qinglan || {};
/**
 * 节点css操作节点命名空间
 * 
 * @namespace
 * @type Object
 */
qinglan.Css = qinglan.Css || {};
/**
 * 检测元素里面是否有指定的className
 * 
 * @param {Element}
 *            node 节点元素
 * @param {String}
 *            calssName 徐璈检测的className
 * @return {Boolean}
 */
qinglan.Css.hasClass = function(node, calssName) {
	if (qinglan.Type.isElement(node)) {
		return qinglan.Css.inClass(calssName, node.className);
	} else {
		qinglan.Debug.info('The arg node : [' + node+ '] is not a Node');
		return false;
	}
};
/**
 * 检测class是否在指定的class集合中
 * 
 * @param {String}
 *            checkClass 需要检测的cssName
 * @param {String}
 *            totlaClass class集合
 * @return {Boolean} 是否包含在内
 */
qinglan.Css.inClass = function(checkClass, totlaClass) {
	var class_arr = qinglan.String.trim(nodeClass).split(" ");
	for (var i = 0, len = class_arr.length; i < len; i++) {
		if (class_arr[i] == calssName)
			return true;
	}
	return false;
};
/**
 * 把指定的className添加到node.className中
 * 
 * @param {Element}
 *            node 节点元素
 * @param {String}
 *            className 需要添加的className
 */
qinglan.Css.addClass = function(node, className) {
	if (qinglan.Type.isArray(className)) {
		qinglan.Array.each(className, function(value) {
					qinglan.Css.addClass(node, value);
				});
	}
	var nodeClassName = node.className;
	!qinglan.Css.inClass(className, nodeClassName)
			&& (node.className += ' ' + className);
};
/**
 * 把指定的className从node.className中移除
 * 
 * @param {Element}
 *            node 节点元素
 * @param {String}
 *            className 需要添加的className
 */
qinglan.Css.removeClass = function(node, className) {
	if (qinglan.Type.isArray(className)) {
		qinglan.Array.each(className, function(value) {
					qinglan.Css.removeClass(node, value);
				});
	};
	var nodeClassName = node.className;
	qinglan.Css.inClass(className, nodeClassName)
			&& (node.className = qinglan.String.trim(node.className.replace(
					className, '').replace(/\s{2}/g, ' ')));
};
/**
 * 得到节点的所有的class
 * 
 * @param {Element}
 *            node 节点元素
 * @return {Array} className数组
 */
qinglan.Css.getAllClass = function(node) {
	return qinglan.String.trim(node.className).split(/\s{1,}/);
};
/**
 * 设置节点的Style
 * 
 * @param {Element}
 *            node 节点元素
 * @param {Object}
 *            styles cssStyle属性
 */
qinglan.Css.setStyle = function(node, styles) {
	if (qinglan.Type.isArray(node)) {
		qinglan.Css.setStyle(node, style);
	};
	qinglan.Extend.simple(node.style, styles, 1);
};
/**
 * 得到节点的样式
 * 
 * @param {Element}
 *            node 节点元素
 * @param {String}
 *            key cssStyle属性key
 */
qinglan.Css.getStyle = function(node, key) {
	var value = qinglan.Browser.isIE ? node.currentStyle[key] : window
			.getComputedStyle(node, null)[key];
	var num = parseFloat (value);
	return isNaN(num) ? ( value != 'auto' ? value : '' ) : num;
};
/**
 * 设置节点透明度
 * 
 * @param {Element}
 *            node 节点元素
 * @param {Number}
 *            opacity 透明度 [0,1]
 */
qinglan.Css.setOpacity = function(node, opacity) {
	qinglan.Browser.isIE ? qinglan.Css.setStyle(node, {
				'filter' : 'alpha(opacity=' + opacity * 100 + ')'
			}) : qinglan.Css.setStyle(node, {
				'opacity' : opacity
			});
};
/**
 * 得到节点透明度
 * 
 * @param {Element}
 *            node 节点元素
 */
qinglan.Css.getOpacity = function(node) {
	return qinglan.Browser.isIE ? qinglan.Css.getStyle(node, 'filter')
			.match(/opacity=(\d+)/)[1] : qinglan.Css.getStyle(node, 'opacity');
};
/**
 * 设置节点样式接口
 * 
 * @param {Element}
 *            node 节点元素
 * @param {Object}
 *            styles cssStyle属性
 */
qinglan.Css.set = function(node, styles) {
	if (styles['opacity']){
		qinglan.Css.setOpacity(node,styles['opacity']);
		delete styles['opacity'];
	} 
	qinglan.Css.setStyle(node,styles);
};
/**
 * 得到节点样式接口
 * 
 * @param {Element}
 *            node 节点元素
 * @param {String}
 *            key cssStyle属性key
 * @return {String}{Number} cssstyleValue
 */
qinglan.Css.get = function(node, key) {
	if ( key == 'opacity'){
		return qinglan.Css.getOpacity(node);		
	}
	else {
		return qinglan.Css.getStyle(node,key);
	}
};
/**
 * 格式化样式表,过滤掉不能够进行数值变化的style<br/>
 * <b>用于处理动画</b>
 * 
 * @param {Object} style 样式对象
 * @return {Arrya} 样式对象数组
 */
qinglan.Css.formatStyle=function(style) {
	var result = {};
	var count = 0;
	for (var s in style){
		var t = style[s].toString().match(/(\d+)($|([a-z]+))/);
		if (t) {
			result[s] ={};
			result[s].key = s;
			result[s].val = qinglan.Type.isNumber(style[s]) ? style[s] : parseFloat(t[1]);
			result[s].px = t[3] || 0.0;
			count++;
		}
	}
	return {style : result, len : count};
};